07. 컬렉션: 중첩을 제거하는 구조화 테크닉

📌 Contents

📌 이미 존재하는 기능을 다시 구현하지 말기

  • anyMatch라는 java 표준 라이브러리에 있는 컬렉션 전용 메서드가 있음
  • anyMatch는 조건을 만족하는 요소가 컬렉션 내부에 하나라도 포함되어 있는 경우, true를 리턴함
  • anyMatch를 사용하면 for 반복문과 if 조건문을 사용할 필요 없이, 한줄로 처리 가능
  • 이처럼 이미 구현되어있는 메서드를 알고 있으면, 복잡한 로직을 직접 구현하지 않아도 됨
  • 반대로 모르면 직접 구현해야 하므로, 코드가 쓸데없이 복잡해지고, 구현 실수로 버그가 발생할 수 있음
  • 표준 컬렌션 라이브러리에는 anyMatch 이외에도 편리한 메서드가 다양하게 있어, for문을 사용해 컬렉션을 직접 조작하고 있다면, 표준 라이브러리에서 같은 기능을 하는 메서드가 있는지 확인하기

Note

이미 널리 사용되고 있는 기술과 해결법이 존재하는데도, 이를 전혀 모르거나 의도적으로 무시하고
비슷한 것을 새로 만들어 내는 것을 바퀴의 재발명이라고 함
이미 존재하는 것보다 좋지 못한 결과물을 만들어 내는 것은 네모난 바퀴의 재발명이라고 함
학습이 목적이라면 바퀴를 재발명 해보는 것도 좋은 방법임

📌 반복 처리 내부의 조건 분기 중첩

조기 컨티뉴로 조건 분기 중첩 제거하기

  • 반복문 내부에 있는 조건 분기 중첩은 6장에서 살펴본 조기 리턴을 응용한 조기 컨티뉴로 해결할 수 있음
  • continue는 실행하고 있는 처리를 건너뛰고, 다음 반복으로 넘어가는 제어 구문
  • 조기 리턴: 조건을 만족하지 않는 경우, return으로 함수를 종료한다
  • 조기 컨티뉴: 조건을 만족하지 않는 경우, continue로 다음 반복으로 넘어간다

조기 브레이크로 중첩 제거하기

  • 반복 처리 제어 구문에는 continue 이외에도 break가 있음
  • break는 처리를 중단하고, 반복문 전체를 벗어나는 제어 구문
  • 조기 컨티뉴와 마찬가지로 조기 브레이크를 사용하면 로직이 단순해 지는 경우가 많음


  • 반복문 처리 내부에서 if 조건문이 중첩될 경우, 조기 컨티뉴와 조기 브레이크를 활용할 수 있는지 컴토해 보자!

📌 응집도가 낮은 컬렉션 처리

  • 컬렉션 처리는 응집도가 낮아지기 쉬움
  • 컬렉션 자료형을 매개변수로 받아 처리하면, 여러 클래스에서 컬렉션 자료형을 처리하게 되기 때문
  • 이렇게 되면 중복 코드가 많아지고 응집도가 낮아지게 됨

컬렉션 처리를 캡슐화하기

  • 컬렉션과 관련된 응집도가 낮아지는 문제는 일급 컬렉션 패턴을 사용해 해결할 수 있음
  • 일급 컬렉션(퍼스트 클래스 컬렉션, First Class Collection)이란 컬렉션과 관련된 로직을 캡슐화하는 디자인 패턴
  • 클래스에는 다음 두 가지가 있어야 함
    • 인스턴스 변수
    • 인스턴스 변수에 잘못된 값이 할당되지 않게 막고, 정상적으로 조작하는 메서드
  • 클래스 설계 원리를 반영하면 일급 컬렉션은, 다음과 같은 요소로 구성됨
    • 컬렉션 자료형의 인스턴스 변수
    • 컬렉션 자료형의 인스턴스 변수에 잘못된 값이 할당되지 않게 막고, 정상적으로 조작하는 메서드
  • 컬렉션과 컬렉션을 조작하는 로직을 한 클래스에 응집한 구조로 만드는 것이 일급 컬렉션임

외부로 전달할 때 컬렉션의 변경 막기

  • 일급 컬렉션으로 설계한 클래스에서 인스턴스 변수를 그대로 외부에 전달하면, 클래스 외부에서 마음대로 컬렉션을 조작할 수 있음
  • 클래스의 응집도를 높게 설계했지만, 이렇게 되면 응집도가 낮을 때와 큰 차이가 없음
  • 외부로 전달할 때는 컬렉션의 요소를 변경하지 못하게 막아 두는 것이 좋음
  • 이 때 unmodifiableList 메서드를 사용
  • unmodifiableList로 리턴되는 컬렉션은 요소를 추가하거나 제거할 수 없음
  • 따라서 클래스 외부에서 마음대로 컬렉션을 조작하는 상황 자체를 방지할 수 있음

❓ Questions

❓ 컬렉션이란?

  • 책에서 컬렉션이라는 자료형을 처음 들어봤는데 배열처럼 많은 데이터를 가진 자료형들을 자바에서 컬렉션이라고 하는 것 같음
  • 자세히 알아보기 위해 찾아봤음
  • 컬렉션 종류에는 크게 Set, List, Queue, Map이 있음
  • Set, List, Queue 인터페이스는 Collection 인터페이스를 상속 받음
  • Map 인터페이스는 Collection 인터페이스를 상속받지는 않지만, Collection으로 분류됨
  • Set
    • 순서를 유지하지 않는 데이터의 집합
    • 데이터의 중복을 허용하지 않음
  • List
    • 순서가 있는 데이터의 집합
    • 데이터의 중복을 허용함
    • ArrayList, LinkedList, Vector가 있음
  • Map
    • 키(Key), 값(Value)의 쌍으로 이루어진 데이터의 집합
    • 순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용함

❓ 컬렉션에는 Set이나 Map도 포함되는데 여기에도 anyMatch와 같은 메서드를 적용 가능한가?

  • anyMatch와 같은 컬렉션 전용 메서드들은 stream API라고도 하는데, Collection 인터페이스에는 stream()이 정의 되어 있어, Collection 인터페이스를 상속받는 자료형들은 .stream().anyMatch와 같은 방법으로 사용할 수 있다
  • stream() 메서드는 해당 Collection의 객체를 소스로 하는 Stream을 반환하는 메서드이다.
  • Stream은 데이터의 연속된 흐름을 나타내는 것이라고 한다.
  • Map 인터페이스는 Collection 인터페이스를 상속받지 않는다 했는데, Map 인터페이스에도 stream()이 정의되어 있다고 한다
  • Map의 경우 key, value 값이 있기 때문에,
  • map.keySet().stream().anyMatch( ... );: key의 집합을 소스로 하는 Stream을 생성 후 메서드 실행
  • map.values().stream().anyMatch( ... );: value의 집합을 소스로 하는 Stream을 생성 후 메서드 실행
  • map.entrySet().stream().anyMatch( ... );: 의 집합을 소스로 하는 Stream을 생성 후 메서드 실행
  • 와 같이 세 가지 방법으로 사용할 수 있다고 한다.

❓ unmodifiableList 메서드와 비슷한 기능을 하는 것이 자바스크립트에도 있을까?

  • 자바스크립트에는 내장되어있는 메서드 중에는 이와 같은 기능을 하는 메서드는 없는 것 같다.
  • 하지만 찾아보니 불변 리스트를 만드는 방법은 몇 가지가 있다.
// 1. Object.freeze() 사용
const list = [1, 2, 3];
const unmodifiableList = Object.freeze(list);

// 2. Immutable.js 라이브러리 사용
const { List } = require("immutable");

const list = [1, 2, 3];
const unmodifiableList = List(list);

results matching ""

    No results matching ""